Bug 4129

Bug Description:

This is a deadlock.
The following is an example of deadlock thread dump:

"Thread-3": waiting to lock monitor 0x000000000bacbeb8 (object 0x00000000ed5373b8,
a org.apache.derby.impl.store.raw.data.StoredPage), which is held by "Thread-2"
"Thread-2": waiting to lock monitor 0x000000000be38318 (object 0x00000000eb3c5d90,
a rg.apache.derby.impl.store.raw.data.BaseContainerHandle), which is held by "Thread-3"

Java stack information for the threads listed above:
===================================================
"Thread-3":
at org.apache.derby.impl.store.raw.data.BasePage.isLatched(BasePage.java:1313)
- waiting to lock <0x00000000ed5373b8> (a org.apache.derby.impl.store.raw.data.StoredPage)

at org.apache.derby.impl.store.raw.data.BasePage.update(BasePage.java:1545)
at java.util.Observable.notifyObservers(Observable.java:159)
at java.util.Observable.notifyObservers(Observable.java:115)
at org.apache.derby.impl.store.raw.data.BaseContainerHandle.informObservers(BaseContainerHandle.java:1008)
at org.apache.derby.impl.store.raw.data.BaseContainerHandle.close(BaseContainerHandle.java:414)
- locked <0x00000000eb3c5d90> (a org.apache.derby.impl.store.raw.data.BaseContainerHandle)
at org.apache.derby.impl.store.access.conglomerate.OpenConglomerate.close(OpenConglomerate.java:917)
at org.apache.derby.impl.store.access.conglomerate.GenericController.close(GenericController.java:139)
at org.apache.derby.impl.store.access.conglomerate.GenericScanController.closeForEndTransaction(GenericScanController.java:1073)
at org.apache.derby.impl.store.access.RAMTransaction.closeControllers(RAMTransaction.java:245)
at org.apache.derby.impl.store.access.RAMTransaction.commit(RAMTransaction.java:1959)
at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.doCommit(GenericLanguageConnectionContext.java:1241)
at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.userCommit(GenericLanguageConnectionContext.java:1061)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.commit(TransactionResourceImpl.java:237)
at org.apache.derby.impl.jdbc.EmbedConnection.commitIfNeeded(EmbedConnection.java:2325)
at org.apache.derby.impl.jdbc.ConnectionChild.commitIfNeeded(ConnectionChild.java:100)
at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1192)
- locked <0x00000000ed508270> (a org.apache.derby.impl.jdbc.EmbedConnection40)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(EmbedPreparedStatement.java:1648)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeQuery(EmbedPreparedStatement.java:270)
at Derby4129$1.run(Derby4129.java:60)
at java.lang.Thread.run(Thread.java:724)

"Thread-2":
at java.util.Observable.deleteObserver(Observable.java:95)
- waiting to lock <0x00000000eb3c5d90> (a org.apache.derby.impl.store.raw.data.BaseContainerHandle)
at org.apache.derby.impl.store.raw.data.BasePage.releaseExclusive(BasePage.java:1740)
- locked <0x00000000ed5373b8> (a org.apache.derby.impl.store.raw.data.StoredPage)

at org.apache.derby.impl.store.raw.data.CachedPage.releaseExclusive(CachedPage.java:528)
at org.apache.derby.impl.store.raw.data.StoredPage.releaseExclusive(StoredPage.java:1093)
at org.apache.derby.impl.store.raw.data.BasePage.unlatch(BasePage.java:1301)
at org.apache.derby.impl.store.raw.data.OverflowInputStream.fillByteHolder(OverflowInputStream.java:152)
at org.apache.derby.impl.store.raw.data.BufferedByteHolderInputStream.read(BufferedByteHolderInputStream.java:44)
at java.io.DataInputStream.readFully(DataInputStream.java:195)
at java.io.DataInputStream.readFully(DataInputStream.java:169)
at org.apache.derby.iapi.types.SQLBinary.readExternal(SQLBinary.java:422)
at org.apache.derby.iapi.types.SQLBinary.getValue(SQLBinary.java:241)
at org.apache.derby.iapi.types.SQLBinary.getBytes(SQLBinary.java:223)
at org.apache.derby.impl.jdbc.EmbedResultSet.getBytes(EmbedResultSet.java:863)
at Derby4129$1.run(Derby4129.java:63)
at java.lang.Thread.run(Thread.java:724)
More details about this bug are at DERBY-4129 JIRA page.

How To Reproduce:

This bug is reproduced under derby 10.5.1.1 and JDK 1.6.0_33.
Execute the following scripts to run the test to reproduce the bug (assume the location of the derby test project is derby_test_home).

Linux:
${derby_test_home}/scripts/4129.sh [--monitoroff]
Windows:
%derby_test_home%\scripts\4129.bat [--monitoroff]

Example:>
Use monitor to report and terminate the program when deadlock happens:
${derby_test_home}/scripts/4129.sh


Turn off monitor:
${derby_test_home}/scripts/4129.sh --monitoroff

Option Function
--monitoroff, -mo Turn off to stop reporting bug messages and ending program when test
runs into the expected concurrency bug which is a deadlock.
User has to terminate the program manually when this option is set.